import { fileURLToPath, URL } from 'node:url';

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

// 加载自动导入的插件
import AutoImport from 'unplugin-auto-import/vite';

// 加载自动生成路由插件
import Pages from 'vite-plugin-pages';

// 加载模板布局插件
import Layouts from 'vite-plugin-vue-layouts';

// 加载导入自定义组件插件
import Components from 'unplugin-vue-components/vite';

// 引入不需要登录认证的路由组
import rules from './src/routers/rules';

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [
        vue(),
        AutoImport({
            imports: ['vue', 'vue-router', 'pinia'],
            // 生成全局自动引入配置文件
            dts: "./src/auto-imports.d.ts",
        }),
        Components({
            // 指定组件位置，默认是src/components
            dirs: ['src/components'],
            // ui库解析器
            // resolvers: [ElementPlusResolver()],
            extensions: ['vue'],
            // 配置文件生成位置
            dts: 'src/components.d.ts',
        }),
        Pages({
            dirs: ['src/views', 'src/templates'], // 需要生成路由的组件目录
            exclude: ['**/components/*.vue'], // 排除在外的目录，即所有 components 目录下的 .vue 文件都不会生成路由
            // 自动生成路由扩展配置
            extendRoute(route, parent)
            {
                // 查找不需要登录的路由
                if (rules.includes(route.path))
                {
                    return route;
                }

                // 给需要登录验证的路由添加meta属性
                return {
                    ...route,
                    meta: { IsLogin: true }
                }
            }
        }),
        Layouts({
            layoutsDirs: 'src/layout', // 布局模板文件存放目录
            defaultLayout: 'index', // 默认布局，对应 src/layout/index.vue
        })
    ],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        }
    },
    server: {
        //开发服务器的配置
        //反向代理
        proxy: {
            '/shop': {
                target: 'http://www.fastadmin.com/shop', //反向代理的目标地址
                changeOrigin: true, //允许跨域
                //替换掉shop前缀 防止多个shop地址
                rewrite: (path) => path.replace(/^\/shop/, ''),
            },
        }
    },
});